//
//  JYPictrueView.swift
//  01.weibo
//
//  Created by 谢玉锋 on 16/7/17.
//  Copyright © 2016年 itheima.cn. All rights reserved.
//

import UIKit
import SDWebImage

/// collectionViewcell的间距
private let JYStatusPictureViewCellMargin: CGFloat = 4  // 2.设置item 间的间距

/// cell的最大列数为3列,列数使用整数
private let JYStatusPictureViewMaxColumn = 3 //  1.规定默认为 3 列

// 计算cell的宽和高    // 3.计算cell的宽和高 (按 1 行 3 列 计算)
private let JYStatusPictureViewItemWH = (UIScreen.mainScreen().bounds.width - 2 * JYStatusCellMargin - (CGFloat(JYStatusPictureViewMaxColumn) - 1) * JYStatusPictureViewCellMargin) / CGFloat(JYStatusPictureViewMaxColumn)

class JYStatusPictrueView: UICollectionView {
    
        private let ReuseIdentifier = "ReuseIdentifier"
    
    /// 配图NSURL数组
    var pictureURLs: [NSURL]? {
        didSet {
            // 当别人设置配图的url后,我们就来计算配图的高度
            let size = calcViewSize()
            
            // 特别提示: 这里用的是 snp_updateConstraints 不是makesnp_makeConstraints 
            // 自己来约束大小,当cell给pictureURLs之后计算出宽高,然后重行修改约束
            
            self.snp_updateConstraints { (make) -> Void in
                make.size.equalTo(size)
            }
            // 因为cell的复用重新刷新数据 (这里更新数据才是最佳时机,)
            self.reloadData()
//            JYPrint("配图大小: \(size)")
        }
    }
    /// 计算配图的宽高
    private func calcViewSize() -> CGSize {
        // 上面 3步骤 不需要每次来计算 所以设为全局变量
        // 4. 设置l ayout.itemSize 和 layout.minimumInteritemSpacing = 0 , layout.minimumLineSpacing = 0
        // 5. 根据图片个数 1张:一张图片是, layout.itemSize 随图片大小 2张和4张: 图片显示2列,其他都显示3列
        // 6.根据公式计算行数 :    行数 = (总个数 + 列数 - 1) / 列数
        // 7.计算宽度和高度 (宽度与列数有关 , 高度于行数有关 ) 返回 size
        // 8. 在原创中 JYStatusOriginalView 先 设置 make.size.equalTo(CGSizeZero)
        // 9. 回到 JYStatusPictrueView 中更新 约束
        
        
        // 设置collectionView layout
        layout.itemSize = CGSize(width: JYStatusPictureViewItemWH, height: JYStatusPictureViewItemWH)
        layout.minimumInteritemSpacing = 0
        layout.minimumLineSpacing = 0
        
        // 判断图片的数量
        let count = pictureURLs?.count ?? 0
        
        // 没有图片
        if count == 0 {
//            JYPrint("没有图片")
            return CGSizeZero
        }
        
        // 1.张图片
        if count == 1 {
            
            // 默认大小
            var size = CGSize(width: JYStatusPictureViewItemWH, height: JYStatusPictureViewItemWH)
            //从磁盘中获取图片
            let url = pictureURLs!.first!
            //注意函数   !!!
            if let image = SDImageCache.sharedImageCache().imageFromDiskCacheForKey(url.absoluteString){
            //在 SDWebimage 3.7.3以后像素转成了点,所以要乘以比例才能还原
            size = image.size
            // 点坐标:像素
                size = CGSize(width: size.width * UIScreen.mainScreen().scale, height: size.height * UIScreen.mainScreen().scale)
//                JYPrint("单张图片size: \(size)")
            }
            // 如果图片太小,或太大,都处理一下
            if size.width < 40 {
                size.width = 40
            }
            
            let screenWidth = UIScreen.mainScreen().bounds.width
            
            if size.width > screenWidth * 0.5 {
                size.width = screenWidth * 0.5
            }

            layout.itemSize = size //注意一张图片是, layout.itemSize 随图片大小
            return size
        }
        
        layout.minimumInteritemSpacing = JYStatusPictureViewCellMargin
        layout.minimumLineSpacing = JYStatusPictureViewCellMargin
        // 多张图片,列数不确定
        // 2张和4图片显示2列,其他都显示3列
        var column = JYStatusPictureViewMaxColumn
        if count == 2 || count == 4 {
            column = 2
        }
        
        // 服务器开发用得比较多,分页,保证列数是整数
        // 2 + 2 - 1 / 2 = 1
        // 3 + 3 - 1 / 3 = 1
        // 4 + 2 - 1 / 2 = 2
        // 5 + 3 - 1 / 3 = 2
        // 6 + 3 - 1 / 3 = 2
        // 7 + 3 - 1 / 3 = 3
        // 行数 = (总个数 + 列数 - 1) / 列数
        let row = (count + column - 1) / column
        
        // 计算宽度和高度
        // 宽度 = 列数 * item宽度 + (列数 - 1) * 列间距
        let widht = CGFloat(column) * JYStatusPictureViewItemWH + (CGFloat(column) - 1) * JYStatusPictureViewCellMargin
        
        // 高度度 = 行数 * item高度 + (行数 - 1) * 行间距
        let height = CGFloat(row) * JYStatusPictureViewItemWH + (CGFloat(row) - 1) * JYStatusPictureViewCellMargin
        return CGSize(width: widht, height: height)
    }
    
    
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    //自定义流水布局
    private var layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
    
    init() {
    super.init(frame: CGRectZero, collectionViewLayout: layout)
        backgroundColor = UIColor.clearColor()
    //设置dataSource代理
    self.dataSource = self
    //设置 delegate
    self.delegate = self
        
    //注册cell                        self ???
    self.registerClass(JYStatusCollectionViewCell.self, forCellWithReuseIdentifier:ReuseIdentifier )
    }
}
// MARK: - 扩展实现数据源

extension JYStatusPictrueView: UICollectionViewDataSource{

    //如果不实现默认为 1 组
//    func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
//
//    }
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return pictureURLs?.count ?? 0
    }
    
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(ReuseIdentifier, forIndexPath: indexPath) as! JYStatusCollectionViewCell
        cell.url = pictureURLs![indexPath.item]
        return cell
    }

}

extension JYStatusPictrueView: UICollectionViewDelegate,SDPhotoBrowserDelegate {
    //实现点击Item代理方法
    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
        
        //实例化SDPhotoBrowser
        let myPhotoBrowserView = SDPhotoBrowser()
        //图片父view
        myPhotoBrowserView.sourceImagesContainerView = collectionView
        //告诉要多少张图片
        myPhotoBrowserView.imageCount = self.pictureURLs?.count ?? 0
        //告诉当前点击是第几张
        myPhotoBrowserView.currentImageIndex = indexPath.item
        //遵守代理
            myPhotoBrowserView.delegate = self
        //展示
        myPhotoBrowserView.show()
    }
    
    //返回占位图片
    func photoBrowser(browser: SDPhotoBrowser!, placeholderImageForIndex index: Int) -> UIImage! {
        //通过cell拿到 图片 作为 展位图
        let cell = cellForItemAtIndexPath(NSIndexPath(forItem: index, inSection: 0)) as? JYStatusCollectionViewCell
        let img =  cell?.bkgImage.image ?? UIImage(named: "avatar")
        return img
    }
    
    //返回高清图片
    func photoBrowser(browser: SDPhotoBrowser!, highQualityImageURLForIndex index: Int) -> NSURL! {
        //将低像素图片的URL 换为大图的 URL
        let urlstr = self.pictureURLs?[index].absoluteString
        let newStr = urlstr?.stringByReplacingOccurrencesOfString("thumbnail", withString: "large")
        JYPrint(newStr)
        return NSURL(string: newStr!)
    }

}


// 自定义 JYStatusCollectionViewCell

class JYStatusCollectionViewCell: UICollectionViewCell {
    
     var url: NSURL? {
        didSet {
        bkgImage.sd_setImageWithURL(url)
        }
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    //UICollectionViewCell 重写的构造函数用这个:
    override init(frame: CGRect) {
        super.init(frame: frame)
       //4.准备UI
        prepareUI()
    }

    private func prepareUI () {
        //图片的填充模式
        bkgImage.contentMode = UIViewContentMode.ScaleAspectFill
        bkgImage.clipsToBounds = true
        //2.添加控件
        addSubview(bkgImage)
        //3.约束控件
        bkgImage.snp_makeConstraints { (make) -> Void in
            make.edges.equalTo(contentView)
        }
    }
    //1.懒加载控件
    private lazy var bkgImage: UIImageView = UIImageView()
}










